#ifndef LOGAN_LOGAN_QUEUE_H
#define LOGAN_LOGAN_QUEUE_H

#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <memory>
#include <atomic>
#include <functional>
#include <string>

// 定义一天的毫秒数常量
#define MS_PER_DAY 86400000

// 定义操作类型枚举
typedef enum {
    LOG_OPERATION_WRITE,
    LOG_OPERATION_FLUSH
} log_operation_type_t;

// 定义日志条目数据结构
typedef struct {
    int flag;
    char *log;
    long long local_time;
    char *thread_name;
    long long thread_id;
    int is_main;
} log_entry_data_t;

// 定义操作结构体
typedef struct {
    log_operation_type_t type;
    log_entry_data_t data;
} log_operation_t;

// 定义JS回调函数类型，参数为命令字符串和错误码
typedef std::function<void(const std::string&, int)> JSLoganCallback;

class LoganQueue {
public:
    static LoganQueue &getInstance();

    ~LoganQueue();

    // 禁止拷贝构造和赋值操作
    LoganQueue(const LoganQueue &) = delete;
    LoganQueue &operator=(const LoganQueue &) = delete;

    // 初始化队列
    void init(int max_queue_size, int save_time = MS_PER_DAY * 7, const char* path_path = nullptr); // 默认保存7天

    // 添加日志写入操作到队列
    bool addLogWrite(int flag, const char *log, long long local_time, const char *thread_name,
                     long long thread_id);

    // 添加日志刷新操作到队列
    bool addLogFlush();

    // 启动写入线程
    void startWriterThread();

    // 停止写入线程
    void stopWriterThread();

    // 设置调试模式
    void setDebug(int debug);

    // 注册JS回调函数
    void registerJSLoganCallback(const JSLoganCallback& callback);

private:
    LoganQueue();

    // 写入线程主函数
    void writerThreadMain();

    // 处理操作
    void processOperation(const log_operation_t &operation);

    // 写入日志
    void writeLog(const log_entry_data_t &entry);

    // 刷新日志
    void flushLog();

    // 释放操作内存
    void freeOperation(log_operation_t &operation);

    // 计算时区偏移
    long calculateTimezoneOffset();

    // 删除过期文件
    void deleteExpiredFile(long long deleteTime);

    // 调用JS回调函数
    void callJSLoganCallback(const std::string& cmd, int code);

    // 队列相关成员变量
    std::queue<log_operation_t> log_queue_;
    std::mutex queue_mutex_;
    std::condition_variable queue_cv_;
    std::unique_ptr<std::thread> writer_thread_;
    std::atomic<bool> writer_running_;
    int max_queue_size_;

    // JS回调函数
    JSLoganCallback js_callback_;

    // 日志目录路径
    char* log_dir_path_;

    // 时区偏移（毫秒）
    long timezone_offset_ms_;
    
    // 保存时间（毫秒）
    long save_time_;
    
    // 主线程ID
    long main_thread_id_;
};

#endif // LOGAN_LOGAN_QUEUE_H